iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 12
0
Modern Web

寫React的那些事系列 第 12

React Day12 - Babel介紹

  • 分享至 

  • xImage
  •  

登愣~今天要來介紹Babel,這也是在使用React上算是不可缺少一定會提到的工具,雖然一直還無法進入正式開發React的階段,可是我們已經周邊配備的工具已經快要補完了!這篇介紹Babel,我想下一篇就可以進入React開發惹~~。

Babel除了可以幫我們compile JSX,最主要的就是它官網寫的

Use next generation JavaScript, today.

它讓我們可以transpiling(轉譯),也就是程式碼對程式碼編譯,可以在官網的Try it out直接看到轉譯的結果,打開網址左邊那欄寫的是ES6的Arrow Function,右邊就是Babel幫我們轉譯後的ES5語法。我們在開發時可以直接使用ES6語法,再透過Babel幫我們轉譯成瀏覽器看得懂的ES5,它是一個強大的compiler,即使沒有要用React,為了寫ES6也可以使用喔!

Babel的設定

babelrc


Babel分成許多核心模組,在預設情況下不會做任何事,你需要自己設定plugins來告訴Babel你要使用什麼功能。最基本設定的方式就是在根目錄下建立一個 .babelrc 檔。

.babelrc 範例:

{
  // 用Array列出要使用的presets (一組相關功能plugins的集合)
  "presets": [],
  // 用Array列出要使用的plugins
  "plugins": [],
  // 設定不執行compile的檔案,可以是正規表示法或是特定路徑
  "ignore": [],
  ...
}

.babelrc是JSON組成的config檔,裡面最主要的就是設定presets和plugins,另外,還有許多其他options可以視需求做設定。

如果不使用.babelrc,我們也可以在package.json檔做設定:

{
  "name": "my-package",
  "version": "1.0.0",
  "babel": {
    // my babel config here
  }
}

由於Babel config有這兩種設定方式,它會按照什麼樣的順序檢查設定檔呢?在查找設定檔時的規則,會先從要被transpiled的檔案的所在目錄尋找 .babelrc 檔,如果沒有,則往上一層目錄查找 .babelrc 檔,或是有包含 "babel": {} 段落的package.json檔,這層如果沒有,就再往上一層。

通常要使用某些plugins,需要一個一個設定,preset就是指把一系列相關的plugins合在一起的組合,官方有推出一些preset讓我們可以直接使用。以下先介紹幾種官方preset。

babel-preset-es2015


而babel-preset-es2015就是把ES6語法轉譯成ES5,讓瀏覽器可以讀懂JS的一組preset。

使用方式:

// CLI安裝
npm install babel-preset-es2015 --save-dev

// .babelrc在presets設定
{
  "presets": ["es2015"]
}

babel-preset-react


轉譯React的JS,設定這組preset就可使用React語法與JSX。

使用方式:

// CLI安裝
npm install babel-preset-react

// .babelrc在presets設定,新增react
{
  "presets": ["es2015", "react"]
}

babel-preset-stage-x


除了上面提到的ES2015/ES6,ES7有四個不同階段的提案,若要使用這四個階段的語法,可以安裝需要的preset,而每個階段都相依於下個階段的提案,例如:stage-1相依於stage-2,stage-2相依於stage-3,可以從官網Plugins介紹瞭解內含的plugins與功能。

使用方式 (以stage-0為例):

// CLI安裝
npm install babel-preset-stage-0

// .babelrc在presets設定,新增stage-0
{
  "presets": ["es2015", "react", "stage-0"]
}

以上,先說明我們常用到的presets,Babel當然還提供更多的plugins和presets,有的preset又有額外設定方式,更多元的應用,但也更複雜一些,可以前往官網Plugins看更多。

Babel的相關使用

babel-cli


babel-cli也就是可以在CLI介面執行Babel transpiling的工具。

安裝 (-g 可以CLI介面直接使用):

npm install babel-cli -g

使用方法:

// 會把這個檔案轉譯的結果,直接顯示在CLI上
babel index.js

// 使用 --out-file 或 -o 設定compile後的檔名
babel index.js --out-file compiled.js

// 使用 --out-dir 或 -d 設定整個folder下檔案都輸出
babel src --out-dir build

若執行指令,輸出沒有被轉譯,表示還沒有config,記得要檢查.babelrc,告訴Babel你要轉譯什麼。

babel-cli指令也可以設定在package.json的script中,如果像上面我們轉譯的指令在CLI執行(global),有時候會遇到不同project希望使用不同Babel版本等問題,所以最好還是by project來使用,那就可以把指令設定在package.json中,並且也把Babel版本設定在devDependencies。

安裝時改成在目錄下,將babel-cli存在devDependencies:

npm install babel-cli --save-dev

package.json 設定指令執行:

{
  "scripts": {
    "build": "babel src --out-dir build"
  }
}

執行compile時,只需要下:

npm run build

babel-register (require hook)


提供當程式碼中有使用require引用.js、.jsx、.es、.es6這些副檔名的檔案時,就能把這些被引用的檔案做轉譯,但使用babel-register本身的檔案並不會轉譯。

安裝在local,存在devDependencies:

npm install babel-register --save-dev

使用方法:

  • 先載入babel-register,再載入要轉譯的檔案index.js
require("babel-register");
require("./index.js");

babel-register只適合在develop階段使用,若是要提供給deploy使用,最好先compile完。

babel-node


如果需要使用node執行某些JS,只需要把node替換成babel-node就可以使用轉譯。
babel-node會跟babel-cli一起安裝,所以要使用babel-node,只需要npm install babel-cli即可。

使用方法:

// 把原本node index.js的指令換成babel-node即可
babel-node index.js

另外,以下指令也可以使用CLI直接進入babel-node編輯模式:

// CLI輸入
babel-node

// 直接輸入程式碼,會output運算結果(不是compile後的code)
[1, 2, 3].map(item => item * item);

babel-core


如果是要在程式碼裡面直接使用Babel轉譯某些程式碼、或是檔案,可以直接使用Babel API

安裝babel-core:

npm install babel-core --save

先用下面三種方式之一,引用babel-core:

var babel = require("babel-core");
import { transform } from 'babel-core';
import * as babel from 'babel-core';

再使用相對應的API:

// 把要轉譯的code用string傳入
babel.transform(code, options)

// 非同步,把要轉譯的檔案用path傳入
babel.transformFile(filename, options, callback)

// 同步,把要轉譯的檔案用path傳入
babel.transformFileSync(filename, options)

// 把要轉譯的AST格式傳入
babel.transformFromAst(ast, code, options);

babel-polyfill


寫前端總是會需要的polyfill,Babel也有 XD

Babel可以轉譯許多ES6語法,可是某些語法還是並沒有被轉譯成所有瀏覽器都看得懂的部分,所以我們需要使用babel-polyfill來模擬完整的ES6環境,讓我們可以在任何瀏覽器都能使用Array.from、Object.assign、generator functions...等語法。

安裝在devDependencies:

npm install babel-polyfill --save-dev

使用方法,以下列出三種:

// 使用require方式,引用在entry的檔案
require("babel-polyfill");

// ES6語法,使用import方式,引用在entry的檔案
import "babel-polyfill";

// 使用webpack.config.js,設定在entry
module.exports = {
  entry: [
    'babel-polyfill',
    './index.js'
  ]
};

參考


Babel 官網
Babel Handbook


上一篇
React Day11 - Webpack(4) Hot Module Replacement (HMR)
下一篇
React Day13 - TODOS Demo(1)
系列文
寫React的那些事31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言